package com.sprouting.ops.dao;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sprouting.ops.interfaces.BaseDaoMapper;
import com.sprouting.ops.model.OpsComputerServer;
import com.sprouting.ops.model.qo.ComputerServerAllQo;
import com.sprouting.ops.model.qo.OpsComputerServerQo;
import com.sprouting.ops.model.vo.OpsComputerServerVo;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 计算机&服务器等
 *
 * @author ：LX（长沙麓谷）
 * @date 创建时间： 2023/11/8 16:31
 */
public interface OpsComputerServerDao extends BaseDaoMapper<OpsComputerServer> {

    /**
     * 分页查询 服务器与计算机信息
     * @param page 分页参数
     * @param query 查询参数
     * @return
     */
    Page<OpsComputerServerVo> getComputerServerPageList(Page page, @Param("query") OpsComputerServerQo query);

    /**
     * 根据场所ID获取服务器数量
     * @param siteId 场所ID
     * @return
     */
    long getCountBySiteId(String siteId);

    /**
     * 检查IP地址是否已经在场所存在
     * @param id 忽略的ID
     * @param siteId 场所ID
     * @param ip 要验证的IP地址
     * @return
     */
    OpsComputerServer getBySiteAndIpFilterId(@Param("id") String id, @Param("siteId") String siteId, @Param("ip") String ip);

    /**
     * 找到下级
     * @param id 上级节点
     * @return
     */
    List<OpsComputerServerVo> getSonNode(String id);

    /**
     * 找到指定id下的所有子级
     * @param parentId 父级ID
     * @return
     */
    List<OpsComputerServerVo> getSonByParentId(String parentId);

    /**
     * 根据场所ID查询计算机信息
     * @param siteId 场所ID
     * @return
     */
    List<OpsComputerServerVo> getBySiteId(String siteId);

    /**
     * 管理员- 查询全部的计算机
     * @param page 分页参数
     * @param query 查询参数
     * @return
     */
    Page<OpsComputerServerVo> getAllComputerServerPageList(Page page, @Param("query") ComputerServerAllQo query);

    /**
     * 获取可迁移的目标计算机
     * id != #{computerserverid}  不等于自身
     * and (parent_ids not like concat('%', #{computerServerId}, '%') or parent_ids is null)  不等于子级
     * and parent_id != #{parentId}  不等于当前的父级（自己在根层的时候不过滤）
     * @param computerServerId 当前计算机
     * @param parentId 父级id
     * @return
     */
    List<OpsComputerServerVo> getTransfer(@Param("computerServerId") String computerServerId, @Param("parentId") String parentId);
}
